//洛谷 1460
/*
题目描述
农民 John 以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。
请你帮助农夫喂养他的牛，以保持它们的健康，使喂给牛的饲料的种数最少。

给出牛所需的最低的维他命量，输出喂给牛需要哪些种类的饲料，且所需的饲料剂量最少。

维他命量以整数表示，每种饲料最多只能对牛使用一次，数据保证存在解。

输入格式
第一行一个整数 vv，表示需要的维他命的种类数。
第二行 vv 个整数，表示牛每天需要的每种维他命的最小量。

第三行一个整数 gg，表示可用来喂牛的饲料的种数。
下面 gg 行，第 nn 行表示编号为 nn 饲料包含的各种维他命的量的多少。

输出格式
输出文件只有一行，包括牛必需的最小的饲料种数 pp；后面有 pp 个数，
表示所选择的饲料编号（按从小到大排列）。

如果有多个解，输出饲料序号最小的（即字典序最小）。

输入输出样例
输入 
4
100 200 300 400
3
50  50  50  50
200 300 200 300
900 150 389 399
输出 
2 1 3
*/
#include<bits/stdc++.h>
using namespace std;
int n;//共需要n种维他命 
int m;//共有多少种饲料 
int a[1000];//需要的每种维他命的量 
int b[1000][1000];//每种饲料所包含的每种维他命的量 
int minn=999999999;//用来记录最小的需要饲料的种数
int ans[1000];//用来存放最终的饲料有哪几种 
int c[1000];//每次搜索选的饲料编号 

bool pd(int x){
	for(int i=1;i<=n;i++){
		int sum=0;
		for(int j=1;j<=x;j++)
			sum+=b[c[j]][i];
			if(sum<a[i]) return false;
	}
	return true;
}

//t表示搜索到了第几种饲料，s表示目前共选了几种饲料 
void dfs(int t,int s){
	//如果所有种类的饲料都搜完了 
	if(t>m){
		if(pd(s)){
			if(s<minn){
				minn=s;
				for(int i=1;i<=minn;i++)
					ans[i]=c[i];
			}
		} 
		return ;
	} 
	c[s+1]=t;//把选的当前是第几种饲料加到答案数组中 
	dfs(t+1,s+1);
	c[s+1]=0;
	dfs(t+1,s);//如果不选第t种饲料 
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>m;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++)
			cin>>b[i][j];
	}
	dfs(1,0);
	cout<<minn<<" ";
	for(int i=1;i<=minn;i++) cout<<ans[i]<<" ";
	return 0;
} 

/*
分析：
    dfs每一种饲料，
首先定义一个搜索函数，函数传递的变量为t和s,t表示搜索到了第t种饲料，s表示目前选的饲料的总数。
然后确定搜索的边界，也就是t>饲料的种数，然后判断每次选的那些饲料中的维生素之和是不是都大于等于牛每天需要的每种维他命的最小量（可以用个函数写）。
如果是，就判断选的饲料的总数小于以前的最优解（类似于打擂台的那种操作），如果小于，那么当前最优解就要被替换掉，而最优解的一个数组也要被替换掉。
最后return即可。

接着开始写函数的主体部分。首先我们选第t种饲料，那么s就要加一，并且我们还要把t存在一个数组当中（想想为什么要存）。
然后就可以调用函数，即search(t+1,s+1); 调完函数后，记得要回溯.把t从数组中拿走。
接下来我们不选第t种饲料，这样做很简单，直接搜索一步：search(t+1,s); 就行了。
*/





